package ru.susu.algebra.centralunits.alternating.tex;

import ru.susu.algebra.centralunits.alternating.MathMethodWithInitializers;
import ru.susu.algebra.centralunits.alternating.initializers.SpecialRowsInitializer;
import ru.susu.algebra.centralunits.alternating.tex.local.ExponentsLemma;
import ru.susu.algebra.centralunits.alternating.tex.local.GammaLemmaGenerator;
import ru.susu.algebra.centralunits.alternating.tex.local.LocalCaseMainTheorem;
import ru.susu.algebra.centralunits.alternating.tex.local.LocalUnitTheorem;
import ru.susu.algebra.centralunits.alternating.tex.local.MainDivisibilityLemma;
import ru.susu.algebra.centralunits.alternating.tex.local.MainLemmaAboutTracesGenerator;
import ru.susu.algebra.centralunits.alternating.tex.local.NotIntegerCharactersLemma;
import ru.susu.algebra.jtex.ITexElement;
import ru.susu.algebra.jtex.StringTexElement;
import ru.susu.algebra.jtex.TexElementWithCode;
import ru.susu.algebra.jtex.UnionTexElement;
import ru.susu.algebra.properties.IPropertySource;

/**
 * @author akargapolov
 * @since: 26.08.2010
 */
public class LocalCaseTexGenerator extends MathMethodWithInitializers<ITexElement>
{
	private static final Class[] DEPENDENCIES = {SpecialRowsInitializer.class};

	@Override
	protected ITexElement directRun(IPropertySource ps) throws Exception
	{
		UnionTexElement union = new UnionTexElement();

		if (SpecialRowsInitializer.listSpecialNotIntegerCharacterRows(ps).isEmpty())
		{
			return union;
		}

		//название секции
		union.addSubElement(TexElementWithCode.section().addSubElement(StringTexElement.text("Изучение локального случая")))
			.addSubElement(StringTexElement.newLineDouble());

		//перечисление особых характеров
		union.addSubElement(new SpecialNotIntegerRowsEnumerator().run(ps));

		//генерация лемм о полях особых характеров
		union.addSubElement(new CharacterFieldLemmasGenerator().run(ps));

		// получение обозначения Z_chi и их вычисление
		union.addSubElement(new ZChiNotationGenerator().run(ps)).addSubElement(StringTexElement.newLineDouble());

		//лемма о гаммах
		union.addSubElement(new GammaLemmaGenerator().run(ps)).addSubElement(StringTexElement.newLineDouble());

		//лемма о характерах
		union.addSubElement(new NotIntegerCharactersLemma().run(ps)).addSubElement(StringTexElement.newLineDouble());

		//главная лемма о 3х следах
		union.addSubElement(new MainLemmaAboutTracesGenerator().run(ps)).addSubElement(StringTexElement.newLineDouble());

		//лемма о 3х следах
		//union.addSubElement(new LemmaAboutTracesGenerator().run(ps)).addSubElement(StringTexElement.newLineDouble());

		//лемма о делимости
		union.addSubElement(new MainDivisibilityLemma().run(ps)).addSubElement(StringTexElement.newLineDouble());

		//лемма о делимости
		//union.addSubElement(new DivisibilityLemma().run(ps)).addSubElement(StringTexElement.newLineDouble());

		//лемма об экспонентах
		union.addSubElement(new ExponentsLemma().run(ps)).addSubElement(StringTexElement.newLineDouble());

		//теоремы о локальных единицах
		union.addSubElement(new LocalUnitTheorem().run(ps)).addSubElement(StringTexElement.newLineDouble());

		//основная теорема локального случая
		union.addSubElement(new LocalCaseMainTheorem().run(ps)).addSubElement(StringTexElement.newLineDouble());

		return union;
	}

	@Override
	protected Class[] getDependentInitializers()
	{
		return DEPENDENCIES;
	}


}
